Previous months’
reports
1. Summary
1.1 Summary table
A total of 736,783 persons have been reached by EiE activities in
2023, of which 384,197 were boys, 339,365 were girls, 6,326 were men and
6,895 were women. Below is a summary by indicator.
Summary statistics for EIE 5Ws reporting, 31 December 2023Indicator | Partners1 | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 15 | 15 | 0 | 432,189 | 1,201,151 | 35.98 |
2. Feeding programmes | 10 | 8 | 0 | 154,237 | 784,647 | 19.66 |
3. Teaching materials | 14 | 14 | 0 | 258,042 | 600,578 | 42.97 |
4. Safe water, personal hygiene | 8 | 7 | 0 | 88,348 | 784,647 | 11.26 |
5. Educators resilience enhancing | 21 | 16 | 0 | 10,815 | 6,018 | 179.71 |
6. Children resilience enhancing | 14 | 15 | 0 | 139,542 | 154,729 | 90.18 |
7. Construction and rehabilitation | 3 | 3 | 0 | 35,933 | 0 | 100.00 |
Total | 41 | 20 | 0 | 736,7832 | 2,146,5452 | 34.32 |
1Only implementing partners |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming, sees a higher proportion of females reached over men.

1.3 By county
50.19% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
1.4 Gaps
As the drought response draws to a close, it is necessary to review
the allocation of resources i.e. have they been fair and proportional to
the needs identified. As mentioned, county-level targets were set in
line with the IPC and are considered valid.

Substantial deviation from targets has been observed, including areas
such as Turkana where targets have been greatly exceeded:
Gaps between reached and targetsCounty | Target | Reached | Gap | Gap% |
|---|
Mandera | 339,483 | 85 | 339,398 | 99.97 |
Makueni | 201,321 | 688 | 200,633 | 99.66 |
Garissa | 268,844 | 7,273 | 261,571 | 97.29 |
Wajir | 258,474 | 17,345 | 241,129 | 93.29 |
Baringo | 86,322 | 9,101 | 77,221 | 89.46 |
Kwale | 60,767 | 9,410 | 51,357 | 84.51 |
Marsabit | 127,609 | 26,761 | 100,848 | 79.03 |
Samburu | 72,788 | 24,046 | 48,742 | 66.96 |
Narok | 83,337 | 29,323 | 54,014 | 64.81 |
West Pokot | 81,626 | 32,489 | 49,137 | 60.20 |
Tana River | 45,347 | 19,142 | 26,205 | 57.79 |
Isiolo | 30,518 | 22,402 | 8,116 | 26.59 |
Turkana | 237,959 | 469,948 | -231,989 | -97.49 |
Kilifi | 0 | 21,033 | -21,033 | -100.00 |
Taita Taveta | 0 | 45 | -45 | -100.00 |
Meru | 0 | 26,104 | -26,104 | -100.00 |
Kajiado | 0 | 39,600 | -39,600 | -100.00 |
Homa Bay | 0 | 188,301 | -188,301 | -100.00 |
Nairobi | 0 | 115 | -115 | -100.00 |
2. Progress by indicator
2.1.1 Overall progress

The rate of increase in the number of beneficiaries reached has yet
to plateau, with only indicators 2 and 6 seeing slight slowdowns in the
number of beneficiaries reached each month.
2.1.2 Reached by indicator

2.2.1 Access to ECD spaces/schools
EiE Indicator 1, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 15 | 15 | 0 | 432,189 | 1,201,151 | 35.98 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 0 were
girls.

2.2.2 School feeding programmes
EiE Indicator 2, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
2. Feeding programmes | 10 | 8 | 0 | 154,237 | 784,647 | 19.66 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 0 were
girls.

2.2.3 Teaching and learning materials
EiE Indicator 3, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
3. Teaching materials | 14 | 14 | 0 | 258,042 | 600,578 | 42.97 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys, 0 were girls, 0
were men and 0 were women.

2.2.4 Safe water, personal hygiene
EiE Indicator 4, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
4. Safe water, personal hygiene | 8 | 7 | 0 | 88,348 | 784,647 | 11.26 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 0 and were
girls.

2.2.5 Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
5. Educators resilience enhancing | 21 | 16 | 0 | 10,815 | 6,018 | 179.71 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were men and 0 and were
women.

2.2.6 Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
6. Children resilience enhancing | 14 | 15 | 0 | 139,542 | 154,729 | 90.18 |

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 0 and were
girls.

2.2.7 Children benefited from construction and rehabilitation
EiE Indicator 7, as of 31 December 2023Indicator | Partners | Counties | December_reached | Total_reached | Target | %Target_reached |
|---|
7. Construction and rehabilitation | 3 | 3 | 0 | 35,933 | 0 | 100 |
To note: targets have not been set for indicator 7.

In December 2023, 0 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 0 and were
girls.
This activity has no targets.
3. Partners
3.1 Operational presence of implementing partners
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column #Activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset from the table below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 518,933 | 5 | 7 | 46.37 |
Women Educational Researchers of Kenya | 83,133 | 5 | 4 | 7.43 |
Jesuit Refugee Service | 77,504 | 1 | 3 | 6.93 |
Food for the Hungry | 58,967 | 2 | 7 | 5.27 |
Windle International | 57,307 | 1 | 3 | 5.12 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 4.73 |
Lifeskills Promoters | 41,564 | 3 | 5 | 3.71 |
Save the Children | 38,889 | 4 | 3 | 3.48 |
World Vision Kenya | 35,584 | 6 | 6 | 3.18 |
UNICEF | 34,732 | 2 | 1 | 3.10 |
Feed the Children | 28,711 | 3 | 1 | 2.57 |
Homa Bay County | 23,166 | 1 | 1 | 2.07 |
We World | 20,947 | 2 | 1 | 1.87 |
AVSI Foundation | 9,768 | 2 | 3 | 0.87 |
Ministry of Education | 8,294 | 2 | 2 | 0.74 |
Nawiri Children Development Program | 6,652 | 5 | 2 | 0.59 |
Edukans | 4,734 | 1 | 1 | 0.42 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.37 |
Special Olympics Kenya | 2,284 | 3 | 3 | 0.20 |
Mondi | 2,197 | 1 | 1 | 0.20 |
Qatar Charity | 1,541 | 1 | 1 | 0.14 |
The Girl Child Network | 1,050 | 2 | 1 | 0.09 |
Frontiers Community Development Organization | 1,044 | 1 | 1 | 0.09 |
Tana North and Tana Delta | 882 | 1 | 1 | 0.08 |
Bartabwa | 849 | 1 | 1 | 0.08 |
County Director of Education Mandera | 600 | 1 | 2 | 0.05 |
Missionary Sisters of the Catechism | 585 | 1 | 1 | 0.05 |
Evangelizing Sisters of Mary | 458 | 1 | 4 | 0.04 |
County Director of Education Wajir | 409 | 1 | 2 | 0.04 |
SMB | 270 | 1 | 1 | 0.02 |
MoE, KNATCOM, STEM Impact Centre | 260 | 2 | 1 | 0.02 |
ERIKs Development Partner | 249 | 1 | 1 | 0.02 |
Servants of the Poor | 202 | 1 | 1 | 0.02 |
Dignitas | 135 | 1 | 1 | 0.01 |
MOE/TSC | 60 | 1 | 1 | 0.01 |
Voluntary Service Overseas | 42 | 1 | 1 | 0.00 |
Futebol da Forcaa | 20 | 1 | 1 | 0.00 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
3.3 Summary by lead_organisation
Summary by lead organisationlead_organisation | reached1 | counties | activities | %total2 |
|---|
UNICEF | 433,004 | 14 | 6 | 38.69 |
Finn Church Aid | 332,789 | 4 | 6 | 29.74 |
Food for the Hungry | 58,967 | 2 | 7 | 5.27 |
World Vision Kenya | 46,871 | 7 | 6 | 4.19 |
| 34,792 | 3 | 2 | 3.11 |
Jesuit Refugee Service | 33,610 | 1 | 3 | 3.00 |
Save the Children | 29,323 | 4 | 3 | 2.62 |
Feed the Children | 28,711 | 3 | 1 | 2.57 |
Lifeskills Promoters | 26,410 | 2 | 4 | 2.36 |
Population Council | 23,166 | 1 | 1 | 2.07 |
We World | 20,947 | 2 | 1 | 1.87 |
Windle International | 18,687 | 1 | 1 | 1.67 |
AVSI Foundation | 10,623 | 5 | 6 | 0.95 |
ChildFund Kenya | 7,696 | 5 | 2 | 0.69 |
Edukans | 4,734 | 1 | 1 | 0.42 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.37 |
Qatar Charity | 1,541 | 1 | 1 | 0.14 |
UNESCO | 1,330 | 3 | 3 | 0.12 |
Missionary Sisters of the Catechism | 500 | 1 | 1 | 0.04 |
Special Olympics Kenya | 423 | 2 | 1 | 0.04 |
Voluntary Service Overseas | 291 | 2 | 1 | 0.03 |
Dignitas | 135 | 1 | 1 | 0.01 |
SMB | 135 | 1 | 1 | 0.01 |
KENYA NATIONAL COMMISSION FOR UNESCO | 115 | 1 | 2 | 0.01 |
Life Skills Promoters | 111 | 1 | 2 | 0.01 |
Evangelizing Sisters of Mary | 35 | 1 | 1 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
Additionally, it is not possible to know which of these schools are
repeats, since only the number of schools reached per sub-county are
reported, not the individual facilites themselves.
5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
indicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 3 #of learners reaached and teachers reached with learning and teaching materials |
indicator 4 # of school with adequate quantity of safe water for drinking and personal hygiene |
indicator 4 # of schools with adequate quantities of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 7 # of children benefitting from child-friendly environment (any construction or rehabilitation) |
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiMzEgRGVjZW1iZXIgMjAyMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvbGxhcHNlZDogbm8NCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCnBhcmFtczogDQogIHJlcG9ydF9kYXRlOiAiMzEgRGVjZW1iZXIgMjAyMyINCiAgcmVwb3J0X21vbnRoOiAiRGVjZW1iZXIiDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KYGBge3IgZGF0YX0NCiMgUnVuIHRoaXMgaWYgeW91IG5lZWQgdG8NCiMgcm1hcmtkb3duOjpyZW5kZXIoaW5wdXQgPSAiNVdzX2NsZWFuaW5nX3NjcmlwdC5SbWQiKQ0KDQpsb2NhdGlvbnMgPC0gcmVhZF94bHN4KCIuL2RhdGEva2VuX2FkbWluYm91bmRhcmllc190YWJ1bGFyZGF0YS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQURNMiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpzaXRyZXBfdGFibGUgPC0gcmVhZF94bHN4KCIuL2RhdGEvc2l0cmVwX3Jlc3VsdHNfdGFibGUueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQp0YXJnZXRzIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllX3RhcmdldHMuY3N2IikNCg0KcGNvZGUxX3NoYXBlIDwtIA0KICBzZjo6c3RfcmVhZCgiLi9kYXRhL2tlbl9hZG1faWViY18yMDE5MTAzMV9zaHAva2VuX2FkbWJuZGFfYWRtMV9pZWJjXzIwMTkxMDMxLnNocCIsIA0KICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmlwYyA8LSByZWFkX2NzdigiLi9kYXRhL2lwYy5jc3YiKQ0KDQpwYXJ0bmVyX2xpc3RfY291bnRpZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9wYXJ0bmVyX2xpc3RfY291bnRpZXMuY3N2IikgJT4lIA0KICBmaWx0ZXIocGFydG5lcl90eXBlID09ICJpbXBsZW1lbnRpbmdfcGFydG5lciIpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICAjIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYm95cyA9IDAsIGdpcmxzID0gMCwgbWVuID0gMCwgd29tZW4gPSAwKSkgJT4lIA0KICAjIFRvdGFsIHJlYWNoZWQgb2YgaW5kaWNhdG9yIDEgaXMgb25seSBib3lzIGFuZCBnaXJscyANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scyBpbiBkcm91Z2h0IGFmZmVjdGVkIGFyZWFzIikgfiANCiAgICAgIGJveXMgKyBnaXJscywNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUgI3w1LjF8NS4yfDUuMyIpIH4gbWVuICsgd29tZW4sDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiKSB+IGJveXMgKyBnaXJscywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3RhbF9yZWFjaGVkKSkgDQoNCmBgYA0KDQpbUHJldmlvdXMgbW9udGhzJyByZXBvcnRzXShodHRwczovL2tlbnlhLWVpZS13Zy5naXRodWIuaW8vKQ0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBTdW1tYXJ5DQoNCiMjIDEuMSBTdW1tYXJ5IHRhYmxlDQoNCmBgYHtyfQ0Kc3VtX3N0YXRzIDwtIGVpZSAlPiUgIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoY291bnR5KSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHJlYWNoZWRfMTI1NiA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFtzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCImIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCg0KDQoNCmBgYA0KDQpBIHRvdGFsIG9mIGByIHN1bV9zdGF0cyAlPiUgcHVsbChyZWFjaGVkXzEyNTYpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIGhhdmUgYmVlbiByZWFjaGVkIGJ5IEVpRSBhY3Rpdml0aWVzIGluIDIwMjMsIG9mIHdoaWNoIGByIHN1bV9zdGF0cyAlPiUgcHVsbChib3lzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwoZ2lybHMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwobWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIHN1bV9zdGF0cyAlPiUgcHVsbCh3b21lbikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIEJlbG93IGlzIGEgc3VtbWFyeSBieSBpbmRpY2F0b3IuDQoNCjxicj4NCg0KYGBge3J9DQoNCg0Kc3VtbWFyeV90YWJsZSA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGgsIHRvdGFsX3JlYWNoZWQsIE5BX2ludGVnZXJfKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCAgIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0obGF0ZXN0X3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFkb3JuX3RvdGFscygicm93IiwsLCwgbGF0ZXN0X3JlYWNoZWQsIHRvdGFsX3JlYWNoZWQpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkcGFydG5lcnMsIHBhcnRuZXJzKSwgDQogICAgICAgICBjb3VudGllcyA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgc3VtX3N0YXRzJGNvdW50aWVzLCBjb3VudGllcyksIA0KICAgICAgICAgdG90YWxfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRyZWFjaGVkXzEyNTYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9yZWFjaGVkKSwgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fc3RhdHMkbGF0ZXN0X3JlYWNoZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0KSksIA0KICAgICAgICAgICAgYnkgPSAiaW5kaWNhdG9yX3Nob3J0IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbXV0YXRlKHRhcmdldCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyAlPiUgZGlzdGluY3QoY291bnR5LCBjb3VudHlfb3ZlcmFsbF90YXJnZXQpICU+JSB7c3VtKC4kY291bnR5X292ZXJhbGxfdGFyZ2V0KX0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCksIA0KICAgICAgICAgdGFyZ2V0ID0gaWZlbHNlKGlzLm5hKHRhcmdldCksIDAsIHRhcmdldCkpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQodG90YWxfcmVhY2hlZCAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocGMpLCAxMDAsIHBjKSkgJT4lDQogIHNlbGVjdChpbmRpY2F0b3IgPSBpbmRpY2F0b3Jfc2hvcnQsIHBhcnRuZXJzLCBjb3VudGllcywgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCwgdGFyZ2V0LCBgJXRhcmdldF9yZWFjaGVkYCA9IHBjKSAlPiUNCiAgc2VsZWN0X2FsbCh+IGdzdWIoImxhdGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICBwYXJhbXMkcmVwb3J0X21vbnRoLCAuKSkgJT4lDQogIHNlbGVjdF9hbGwofiBzdHJfdG9fdGl0bGUoLikpICANCg0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBFSUUgNVdzIHJlcG9ydGluZywgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjcsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICIxIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiT25seSBpbXBsZW1lbnRpbmcgcGFydG5lcnMiKSkgJT4lIA0KICBmb290bm90ZShpID0gOCwgaiA9IDU6NiwgcmVmX3N5bWJvbHMgPSAiMiIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgdGhlIHN1bSBvZiBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkNCg0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4yIEJ5IHNleCBhbmQgYWdlDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlKGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKG1lbiwgd29tZW4pLCB+IGlmZWxzZShzdHJfZGV0ZWN0KGluZGljYXRvciwgIjEiKSwgMCwgLikpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiBzdW0oLiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuLCANCiAgICAgICAgIGZlbWFsZSA9ICh3b21lbiArIGdpcmxzKSAvIHRvdGFsX3JlYWNoZWQsIA0KICAgICAgICAgbWFsZSA9IChib3lzICsgbWVuKSAvIHRvdGFsX3JlYWNoZWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlLCBtYWxlKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXgiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwYyIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBzZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NDM5ODMiLCAiIzM1Yjc3OSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJTZXggYnJlYWtkb3duIGJ5IGluZGljYXRvciIpICANCg0KYGBgDQoNCjxicj4NCg0KT25seSBJbmRpY2F0b3IgNiwgQ2hpbGRyZW4gYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UtZW5oYW5jaW5nIHByb2dyYW1taW5nLCBzZWVzIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgZmVtYWxlcyByZWFjaGVkIG92ZXIgbWVuLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JQ0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCB+IHN1bSguKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKG1lbiwgd29tZW4sIGJveXMsIGdpcmxzKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0eXBlIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVhY2hlZCIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBzdHJfdG9fdGl0bGUodHlwZSksIA0KICAgICAgICAgdHlwZSA9IGZjdF9yZWxldmVsKHR5cGUsIGMoIk1lbiIsICJXb21lbiIsICJCb3lzIiwgIkdpcmxzIikpKSAlPiUgDQogICMgWW91J3JlIGp1c3QgZmlsdGVyaW5nIHRoZW0gb3V0IG1hbnVhbGx5DQogIG11dGF0ZShyZWFjaGVkID0gY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiQm95cyIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIHR5cGUgPT0gIkdpcmxzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiTWVuIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiV29tZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiB0eXBlID09ICJXb21lbiIgfiAwLA0KICAgIFRSVUUgfiByZWFjaGVkDQogICkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gdHlwZSwgeCA9IHJlYWNoZWQsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEgLyAxMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjIsIGVuZCA9IC45KSArIA0KICBmYWNldF93cmFwKH4gaW5kaWNhdG9yX3Nob3J0KSArIA0KICBsYWJzKHggPSAiUGVyc29ucyByZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJSZWFjaCBkaXNhZ2dyZWdhdGVkIGJ5IHNleCwgYWdlIGFuZCBpbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4zIEJ5IGNvdW50eQ0KDQpgYGB7cn0NCmN1bV9wYzwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHRhcmdldCA9IDApKSAlPiUgDQogIG11dGF0ZShwY19iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY190YXJnZXQgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShjdW1fcGMgPSBjdW1zdW0ocGNfYmVuKSkNCmBgYA0KDQpgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChjdW1fcGMpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBvcmlnaW5hdGUgZnJvbSBUdXJrYW5hLCB0aG91Z2ggaXQgb25seSBoYXMgYHIgY3VtX3BjICU+JSBmaWx0ZXIoY291bnR5ID09ICJUdXJrYW5hIikgJT4lIHB1bGwocGNfdGFyZ2V0KWAlIG9mIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLg0KDQo8YnI+DQoNCmBgYHtyfQ0KDQplaWUgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lICANCiAgbXV0YXRlKGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgc2VjdG9yX3JlYWNoZWQpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIGxlZnRfam9pbihpcGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtMV9wY29kZSwgcGVyY2VudF9waGFzZV9wMyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHNlY3Rvcl9yZWFjaGVkLCB0YXJnZXQpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZmVsc2UodHlwZSA9PSAidGFyZ2V0IiwgIkNvdW50eSBUYXJnZXQiLCAiU2VjdG9yIFJlYWNoZWQiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmFsdWUgPSAwKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCANCiAgICAgICAgICAgICB5ID0gY291bnR5LCANCiAgICAgICAgICAgICBmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHZhbHVlKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxLzEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50KSArIA0KICBmYWNldF9ncmlkKH4gdHlwZSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMzKyIsDQogICAgICAgeCA9ICJUYXJnZXQvcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9ICJDb2xvdXJzIHJlZmVyIHRvICUgb2YgY291bnR5IHBvcHVsYXRpb24gaW4gSVBDIHBoYXNlIDMgb3IgYWJvdmUuIEhvbWEgQmF5IHdhcyBub3QgYXNzZXNzZWQgYXMgcGFydCBvZiB0aGUgSVBDIENsYXNzaWZpY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHRhcmdldHMgYW5kIHJlYWNoZWQiKSArDQogIHRoZW1lKCMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgICMgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS40IEdhcHMNCg0KQXMgdGhlIGRyb3VnaHQgcmVzcG9uc2UgZHJhd3MgdG8gYSBjbG9zZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJldmlldyB0aGUgYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgaS5lLiBoYXZlIHRoZXkgYmVlbiBmYWlyIGFuZCBwcm9wb3J0aW9uYWwgdG8gdGhlIG5lZWRzIGlkZW50aWZpZWQuIEFzIG1lbnRpb25lZCwgY291bnR5LWxldmVsIHRhcmdldHMgd2VyZSBzZXQgaW4gbGluZSB3aXRoIHRoZSBJUEMgYW5kIGFyZSBjb25zaWRlcmVkIHZhbGlkLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9N30NCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwIHwgdGFyZ2V0ID4gMCkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKGdhcCA9IHRhcmdldCAtIHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIGdhcF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShnYXAgLyB0YXJnZXQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FwIC8gdGFyZ2V0KSkgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMoc2VjdG9yX3JlYWNoZWQsIHRhcmdldCwgZ2FwLCBnYXBfcGMpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBtdXRhdGUobGFiZWwgPSBwYXN0ZTAoY29tbWEoZ2FwKSwgIlxuIiwgcGVyY2VudChnYXBfcGMpKSwgDQogICAgICAgICBsYWJlbCA9IGlmZWxzZShzdHJfZGV0ZWN0KGxhYmVsLCAiTkEiKSwgIiIsIGxhYmVsKSkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAwLjEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGdhcF9wYykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBsYWJlbCksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk1MCIsIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJ0dXJibyIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMywgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xLCAtLjUsIDAsIC41LCAuOTkpKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJHYXBzIGluIERyb3VnaHQgUmVzcG9uc2UiLA0KICAgICAgIHN1YnRpdGxlID0gIkluIHRlcm1zIG9mIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFuZCAlIG9mIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJHYXAgJSIpDQogIA0KICANCmBgYA0KDQo8YnI+DQoNClN1YnN0YW50aWFsIGRldmlhdGlvbiBmcm9tIHRhcmdldHMgaGFzIGJlZW4gb2JzZXJ2ZWQsIGluY2x1ZGluZyBhcmVhcyBzdWNoIGFzIFR1cmthbmEgd2hlcmUgdGFyZ2V0cyBoYXZlIGJlZW4gZ3JlYXRseSBleGNlZWRlZDoNCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwIHwgdGFyZ2V0ID4gMCkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKGdhcCA9IHRhcmdldCAtIHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIGdhcF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShnYXAgLyB0YXJnZXQgKiAxMDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChnYXAgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpKSkgJT4lIA0KICBzZWxlY3QoQ291bnR5ID0gY291bnR5LCANCiAgICAgICAgIFRhcmdldCA9IHRhcmdldCwNCiAgICAgICAgIFJlYWNoZWQgPSBzZWN0b3JfcmVhY2hlZCwgDQogICAgICAgICBHYXAgPSBnYXAsIA0KICAgICAgICAgYEdhcCVgID0gZ2FwX3BjKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhgR2FwJWApKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNykgJT4lIA0KICBzZXRfY2FwdGlvbigiR2FwcyBiZXR3ZWVuIHJlYWNoZWQgYW5kIHRhcmdldHMiKQ0KYGBgDQoNCiMgMi4gUHJvZ3Jlc3MgYnkgaW5kaWNhdG9yDQoNCjxicj4NCg0KIyMgMi4xLjEgT3ZlcmFsbCBwcm9ncmVzcw0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQoNCmxpbmVfdmFsdWVzIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIHN0YXRfc21vb3RoKGdlb20gPSAibGluZSIsIGFwaGEgPSAuMywgc3BhbiA9IC41KSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICB4ID0gLUluZiwgeSA9IEluZiwgaGp1c3QgPSAtMC4xNSwgdmp1c3QgPSAwLjksIGRhdGEgPSBsaW5lX3ZhbHVlcykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgZmFjZXRfd3JhcCh+aW5kaWNhdG9yX3Nob3J0LCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgaW50ZXJ2ZW50aW9ucyIsIA0KICAgICAgIHRpdGxlID0gcGFzdGUwKCJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpLA0KICAgICAgIHN1YnRpdGxlID0gIkluZGljYXRvciBzdWJ0b3RhbCBpbiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIGVhY2ggZmFjZXQiKSANCiAgDQoNCg0KYGBgDQoNCjxicj4NCg0KVGhlIHJhdGUgb2YgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaGFzIHlldCB0byBwbGF0ZWF1LCB3aXRoIG9ubHkgaW5kaWNhdG9ycyAyIGFuZCA2IHNlZWluZyBzbGlnaHQgc2xvd2Rvd25zIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGVhY2ggbW9udGguDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLjEuMiBSZWFjaGVkIGJ5IGluZGljYXRvcg0KDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVhY2hlZCwgeSA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IC44KSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKHggPSBwYXN0ZTAoIlRvdGFsIHJlYWNoZWQgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgZWFjaCBFaUUgaW5kaWNhdG9yIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQpgYGB7cn0NCmJlbl9wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgDQp9DQoNCnBjX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAuMSksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICIlIG9mIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIiUgcmVhY2hlZCIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgKw0KICAgIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCn0NCmBgYA0KDQpgYGB7cn0NCnRhcmdldHNfcmFuZ2UgPC0gdGFyZ2V0cyAlPiUgDQogIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluZGljYXRvcl9zaG9ydCwgdmFsdWVzX2Zyb20gPSB0YXJnZXQpICU+JSANCiAgc2V0TmFtZXMoYygiY291bnR5IiwgImluZGljYXRvcjEiLCAiaW5kaWNhdG9yMiIsICJpbmRpY2F0b3IzIiwgImluZGljYXRvcjQiLCANCiAgICAgICAgICAgICAiaW5kaWNhdG9yNSIsICJpbmRpY2F0b3I2IikpICU+JSANCiAgbXV0YXRlKGluZGljYXRvcjcgPSAwKQ0KDQppbmRpY2F0b3JfbWFwIDwtIGZ1bmN0aW9uKHRibCwgaW5kaWNhdG9yX251bWJlciwgcGxvdF9vcHRpb24pIHsNCiAgDQogIHBsb3Rfb3B0aW9uIDwtIGVucXVvKHBsb3Rfb3B0aW9uKQ0KICBpbmRpY2F0b3JfbnVtYmVyIDwtIGVucXVvKGluZGljYXRvcl9udW1iZXIpDQogIA0KICB0YmwgJT4lIA0KICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwIHwgY291bnR5X3RhcmdldCA+IDApICAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgbmFuaWFyOjpyZXBsYWNlX3dpdGhfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSANCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHkgPSBhZG0xX2VuLCBhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSBjKCJhZG0xX3Bjb2RlIikpICU+JQ0KICAgIHN0X2FzX3NmKCkgJT4lIA0KICAgIGdncGxvdCgpICsgDQogICAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgICBhZXMoZmlsbCA9ICEhcGxvdF9vcHRpb24pKSArIA0KICAgIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYSghIXBsb3Rfb3B0aW9uKSksDQogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLA0KICAgICAgICAgICAgICAgICBzaXplID0gMi41KSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICAgIHRoZW1lX3ZvaWQoKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQogICAgDQp9DQoNCmBgYA0KDQojIyMgMi4yLjEgQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjEiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAxLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMSksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjEuIENoaWxkcmVuIGFjY2Vzc2luZyBFQ0Qgc3BhY2VzL3NjaG9vbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuMiBTY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiMiIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDIsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjIpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIyLiBGZWVkaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuMyBUZWFjaGluZyBhbmQgbGVhcm5pbmcgbWF0ZXJpYWxzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiMyIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDMsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjMpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJG1lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBtYXRlcmlhbHMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNCBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNCIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDQsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjQpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI0LiBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNSBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDUsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNSIsIGNvdW50eV90YXJnZXQpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmEudmFsdWUgPSAiZ3JleTgwIiwgbGltaXRzID0gcmFuZ2UoYygwLCAxODEzKSkpICsgDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBiZW5lZmljaWFyaWVzKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kd29tZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSB3b21lbi4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNiIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDYsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNiIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNiIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjYpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjcgQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gY29uc3RydWN0aW9uIGFuZCByZWhhYmlsaXRhdGlvbg0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjciKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA3LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KVG8gbm90ZTogdGFyZ2V0cyBoYXZlIG5vdCBiZWVuIHNldCBmb3IgaW5kaWNhdG9yIDcuDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjciLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjciLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I2KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI3LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI3IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjciKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjciKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzLg0KDQpUaGlzIGFjdGl2aXR5IGhhcyBubyB0YXJnZXRzLg0KDQo8YnI+PGJyPjxicj4NCg0KIyAzLiBQYXJ0bmVycw0KDQojIyAzLjEgT3BlcmF0aW9uYWwgcHJlc2VuY2Ugb2YgaW1wbGVtZW50aW5nIHBhcnRuZXJzDQoNCjxicj4NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD03fQ0KDQpwYXJ0bmVyX21hcCA8LSBlaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgbGVhZF9vcmdhbmlzYXRpb24gPSBuX2Rpc3RpbmN0KGxlYWRfb3JnYW5pc2F0aW9uKSwNCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBib3lzID0gc3VtKGJveXNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBnaXJscyA9IHN1bShnaXJsc1thY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgdG90YWxfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShyZWFjaGVkID0gbWVuICsgd29tZW4gKyBib3lzICsgZ2lybHMsIA0KICAgICAgICAgbWFsZSA9IG1lbiArIGJveXMsIA0KICAgICAgICAgZmVtYWxlID0gd29tZW4gKyBnaXJscywgDQogICAgICAgICBtYWxlX3BjID0gcm91bmQobWFsZSAvIHJlYWNoZWQgKiAxMDApLCANCiAgICAgICAgIGZlbWFsZV9wYyA9IHJvdW5kKGZlbWFsZSAvIHJlYWNoZWQgKiAxMDApKSAlPiUgIA0KICBsZWZ0X2pvaW4ocGFydG5lcl9saXN0X2NvdW50aWVzICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdChhZG0xX3Bjb2RlLCBhY3JvbnltKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoYWNyb255bSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYWNyb255bSA9IHBhc3RlMChhY3JvbnltLCBjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGFjcm9ueW0gPSBzdHJfcmVwbGFjZV9hbGwoYWNyb255bSwgIkNoaWxkRnVuZCIsICJDRiIpLCANCiAgICAgICAgICAgICAgICAgICAgIG5fcGFydG5lcnMgPSBzdHJfY291bnQoYWNyb255bSwgIiwiKSArIDEpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBkYXRhID0gcGNvZGUxX3NoYXBlKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBhcnRuZXJzLCANCiAgICAgICAgICAgICAgY29sb3VyID0gYWRtMV9wY29kZSkpICsNCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCggDQogICAgY291bnR5LCAiXG4iLCBwYXJ0bmVycyksIA0KICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAgICAgICAgICAgIkNvdW50eTogIiwgY291bnR5LCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUGFydG5lcnM6ICIsIG5fcGFydG5lcnMsICJcbiIsIA0KICAgICAgICAgICAgICAgICJSZWFjaGVkOiAiLCBjb21tYSh0b3RhbF9yZWFjaGVkKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIkZlbWFsZV9yZWFjaGVkJTogIiwgZmVtYWxlX3BjLCAiJSwgIiwgIk1hbGVfcmVhY2hlZCU6ICIsIG1hbGVfcGMsICIlIiwgDQogICAgICAgICAgICAgICAgIlxuIiwgIA0KICAgICAgICAgICAgICAgIGFjcm9ueW0pKSwgDQogICAgICAgICAgICAgICAgc2l6ZSA9IDMsIGNvbG91ciA9ICJncmF5NDAiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEsIDMsIDYsIDEwKSkgKyANCiAgDQogIHRoZW1lX3ZvaWQoKSArIA0KICAjIFJlbWVtYmVyIHRoYXQgeW91IG5lZWQgZ3VpZGVfY29sb3JiYXIsIG5vdCBndWlkZV9sZWdlbmQNCiAgIyBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKHJldmVyc2UgPSBUUlVFKSkgKyANCiAgbGFicyh0aXRsZSA9ICJFZHVjYXRpb24gaW4gRW1lcmdlbmNpZXMgV29ya2luZyBHcm91cCBvcGVyYXRpb25hbCBwcmVzZW5jZSIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpLCANCiAgICAgICBmaWxsID0gIlBhcnRuZXJzIikNCg0KDQpnZ3Bsb3RseShwYXJ0bmVyX21hcCwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoc3VtX3N0YXRzJHBhcnRuZXJzLCAiIEVpRSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYWNyb3NzICIsIHN1bV9zdGF0cyRjb3VudGllcywgIiBjb3VudGllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSwgIjsgbW91c2Ugb3ZlciBjb3VudHkgbmFtZSBmb3IgbW9yZSBkZXRhaWxzIiwgIjwvc3VwPiIpKSkNCmBgYA0KDQo8YnI+DQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHRhYmxlIHdoaWNoIGFkZHMgZGV0YWlsIHRvIHRoZSBtYXAgYWJvdmUsIHNlcnZpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgY29vcmRpbmF0aW9uIC0tIGFsbG93aW5nIGludGVyZXN0ZWQgcGFydGllcyB0byBzZWFyY2ggYnkgY291bnR5IG9yIHBhcnRuZXIuDQoNClRoZSBjb2x1bW4gYCNBY3Rpdml0aWVzYCByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBFZHVjYXRpb24gYWN0aXZpdGllcyBpbXBsZW1lbnRlZCBieSBzYWlkIHBhcnRuZXIgaW4gZWFjaCBjb3VudHkuIEVhY2ggY29sdW1uIGNhbiBiZSBzb3J0ZWQgd2l0aCB0aGUgYXJyb3dzIG5leHQgdG8gZWFjaCBjb2x1bW4gbmFtZS4gRWFjaCBjb2x1bW4gY2FuIGFsc28gYmUgZmlsdGVyZWQgYnkgdHlwaW5nIGludG8gdGhlIHNlYXJjaCBiYXIgYmVsb3cgZWFjaCBjb2x1bW4gbmFtZS4gT25seSBjb21wbGV0ZWQgYWN0aXZpdGllcyBoYXZlIGJlZW4gaW5jbHVkZWQuDQoNCmBgYHtyfQ0KZWllICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pLCB+IA0KICAgICAgICAgICAgICBzdHJfc3ViKC4sIGVuZCA9IDUwTCkpICU+JSAgDQogIGdyb3VwX2J5KGNvdW50eSwgYWRtMV9wY29kZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWRbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiwgcmVhY2hlZCwgYCNhY3Rpdml0aWVzYCA9IGFjdGl2aXRpZXMsIGFkbTFfcGNvZGUpICU+JSANCiAgd3JpdGVfY3N2KCIuL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdiIpDQpgYGANCg0KRG93bmxvYWQgdGhlIGRhdGFzZXQgZnJvbSB0aGUgdGFibGUgYmVsb3cgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9ibG9iL21haW4vZGF0YS9icmVha2Rvd25fYnlfY291bnR5X3BhcnRuZXIuY3N2KS4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBsZWZ0X2pvaW4ocGFydG5lcl9saXN0X2NvdW50aWVzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QocGFydG5lciwgYWNyb255bSksIA0KICAgICAgICAgICAgYnkgPSBjKCJpbXBsZW1lbnRpbmdfcGFydG5lciIgPSAicGFydG5lciIpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGxlYWRfb3JnYW5pc2F0aW9uLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgYWNyb255bSwgcmVhY2hlZCwgYCNhY3Rpdml0aWVzYCA9IGFjdGl2aXRpZXMsIGFkbTFfcGNvZGUpICU+JSANCiAgc2VsZWN0X2FsbCguLCB+IHN0cl90b190aXRsZSguKSkgJT4lIA0KICBkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZToxMjAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJyZWFrZG93biBieSBjb3VudHkgYW5kIHBhcnRuZXIiKSkgJT4lIA0KICBmb3JtYXRTdHlsZSgwLCB0YXJnZXQgPSAicm93IiwgbGluZUhlaWdodCA9ICI4MCUiLCBmb250U2l6ZSA9ICI4MCUiKSAlPiUgDQogIGZvcm1hdEN1cnJlbmN5KGMoIlJlYWNoZWQiKSwgDQogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsIGludGVydmFsID0gMywgbWFyayA9ICIsIikgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJSZWFjaGVkIiksIGRpZ2l0cyA9IDApDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4yIFN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXINCg0KVGhlIHRhYmxlIGJlbG93IGJyZWFrcyBkb3duIHBlcnNvbnMgcmVhY2hlZCBieSBwYXJ0bmVyLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSBzdHJfc3ViKGltcGxlbWVudGluZ19wYXJ0bmVyLCBlbmQgPSA1MEwpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgZmlsdGVyKHJlYWNoZWQgPiAwKSAlPiUgDQogIG11dGF0ZShgJXRvdGFsYCA9IHJvdW5kKHJlYWNoZWQgLyBzdW0ocmVhY2hlZCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZWFjaGVkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3VtbWFyeSBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45KSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcmVmX3N5bWJvbHMgPSAiMSIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJBbGwgaW5kaWNhdG9ycyBhcyBvcHBvc2VkIG9ubHkgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA1LCByZWZfc3ltYm9scyA9ICIyIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIlBlcmNlbnRhZ2Ugb2YgcmVhY2hlZCBmb3IgYWxsIGluZGljYXRvcnMiKSkNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMyBTdW1tYXJ5IGJ5IGxlYWRfb3JnYW5pc2F0aW9uDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUobGVhZF9vcmdhbmlzYXRpb24gPSBzdHJfc3ViKGxlYWRfb3JnYW5pc2F0aW9uLCBlbmQgPSA1MEwpKSAlPiUgDQogIGdyb3VwX2J5KGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgZmlsdGVyKHJlYWNoZWQgPiAwKSAlPiUgDQogIG11dGF0ZShgJXRvdGFsYCA9IHJvdW5kKHJlYWNoZWQgLyBzdW0ocmVhY2hlZCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZWFjaGVkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3VtbWFyeSBieSBsZWFkIG9yZ2FuaXNhdGlvbiIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45KSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcmVmX3N5bWJvbHMgPSAiMSIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJBbGwgaW5kaWNhdG9ycyBhcyBvcHBvc2VkIG9ubHkgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA1LCByZWZfc3ltYm9scyA9ICIyIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIlBlcmNlbnRhZ2Ugb2YgcmVhY2hlZCBmb3IgYWxsIGluZGljYXRvcnMiKSkNCiAgDQpgYGANCg0KIyA0LiBTY2hvb2xzIGFuZCBlZHVjYXRpb24gbGV2ZWwNCg0KIyMgNC4xIFNjaG9vbHMNCg0KVGhlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgYnkgc2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcyBhbmQgV0FTSCBpbiBzY2hvb2xzIGludGVydmVudGlvbnMgdG8tZGF0ZSBhcmU6DQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGZpbHRlcighaXMubmEobnVtYmVyX3NjaG9vbHMpKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBuYW1lX3RvX2RhdGUobW9udGgpKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NCIpKSAlPiUNCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShzY2hvb2xzID0gc3VtKG51bWJlcl9zY2hvb2xzKSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQpKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX3NjaG9vbHMgPSBjdW1zdW0oc2Nob29scykpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9zY2hvb2xzKSwgDQogICAgICAgICB2anVzdCA9IC0uNSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsgDQogIGdlb21fbGluZShzaXplID0gMS43LCANCiAgICAgICAgICAgIGFlcyhjb2xvdXIgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoY3VtX3NjaG9vbHMpKSwgdmp1c3QgPSAtLjUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjMzE2ODhlIiwgIiNkODU3NmIiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIiwgDQogICAgICAgdGl0bGUgPSAiU2Nob29scyByZWFjaGVkIGJ5IGZlZWRpbmcgcHJvZ3JhbW1lcyBhbmQgV0FTSCBpbiBzY2hvb2xzIiwgDQogICAgICAgY29sb3VyID0gIkluZGljYXRvciIpDQoNCg0KYGBgDQoNCjxicj4NCg0KSG93ZXZlciwgcmVwb3J0aW5nIHRoZSBvdmVyYWxsIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgYnkgYWxsIEVpRSBpbnRlcnZlbnRpb25zIGlzIG11Y2ggbW9yZSBjaGFsbGVuZ2luZy4NCg0KV2hpbHN0IGFsbCBwYXJ0bmVycyB3b3JraW5nIG9uIGluZGljYXRvcnMgMiBhbmQgNCBzdWJtaXR0ZWQgdGhlIG51bWJlciBvZiBzY2hvb2xzIHRoZXkgd2VyZSB3b3JraW5nIGluLCB0aGUgc2FtZSBpcyBub3QgdHJ1ZSBmb3IgdGhlIG90aGVyIGluZGljYXRvcnMuIE9ubHkgaW5kaWNhdG9ycyAyIGFuZCA0IHJlcXVpcmUgdGhlIHJlcG9ydGluZyBvZiB0aGUgbnVtYmVyIG9mIHNjaG9vbHMuDQoNCkFkZGl0aW9uYWxseSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGtub3cgd2hpY2ggb2YgdGhlc2Ugc2Nob29scyBhcmUgcmVwZWF0cywgc2luY2Ugb25seSB0aGUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCBwZXIgc3ViLWNvdW50eSBhcmUgcmVwb3J0ZWQsIG5vdCB0aGUgaW5kaXZpZHVhbCBmYWNpbGl0ZXMgdGhlbXNlbHZlcy4NCg0KPGJyPjxicj48YnI+DQoNCiMgNS4gUmVmZXJlbmNlIG1hcHMgYW5kIHRhYmxlcw0KDQojIyA1LjEgUmVmZXJlbmNlIG1hcHMNCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjU0MS8/aXNvMz1LRU4pLg0KDQpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTB9DQppcGMgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbnVtYmVyX3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKG51bWJlcl9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gLjQsICwgZGlyZWN0aW9uID0gLTEpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiQXQgbGVhc3RcbnBoYXNlIDMiLCANCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgcGVyc29ucyBJUEMgUGhhc2UgMyBvciBhYm92ZSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvIikgKyANCg0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBlcmNlbnRfcGhhc2VfcDMpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwZXJjZW50X3BoYXNlX3AzKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IHBlcmNlbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgSVBDIHBoYXNlIDMiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsNCg0KDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDApICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHNlY3Rvcl9yZWFjaGVkKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHNlY3Rvcl9yZWFjaGVkKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjIsDQogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMzk0ODMpKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIlNlY3RvclxucmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlBlcnNvbnMgcmVhY2hlZCBieSB0aGUgRWR1Y2F0aW9uIFNlY3RvciIpICsgDQogIA0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoYWRtMV9wY29kZSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QocmVhY2hlZCA9IDAsIHRhcmdldCA9IDApKSAlPiUgDQogIG11dGF0ZShwYyA9IGlmZWxzZSh0YXJnZXQgPT0gMCwgMCwgcmVhY2hlZCAvIHRhcmdldCkpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGMpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwNCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwNCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiJSBvZiB0YXJnZXQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIEVpRSBjb3VudHkgdGFyZ2V0IHJlYWNoZWQiKSArICAgDQoNCnBsb3RfbGF5b3V0KG5jb2wgPSAyLCANCiAgICAgICAgICAgIG5yb3cgPSAyKQ0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4yIFJlZmVyZW5jZSB0YWJsZQ0KDQpEb3dubG9hZCB0aGUgRWlFIDVXcyBkYXRhIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvZWllXzV3cy5jc3YpDQoNCkFzIGEgcmVmcmVzaGVyIGZvciB0aGUgcmVmZXJlbmNlIHRhYmxlIGJlbG93LCB0aGUgaW5kaWNhdG9ycyBhcmU6DQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoIXN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiNS4xfDUuMnw1LjMiKSkgJT4lIA0KICBkaXN0aW5jdChpbmRpY2F0b3IpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3IpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMod2lkdGggPSAuODUsIGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICBmb250c2l6ZShpID0gMTo3LCBqID0gMSwgc2l6ZSA9IDkpIA0KDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSwgDQogICAgICAgICBpbmRpY2F0b3JfbnVtYmVyID0gcGFyc2VfbnVtYmVyKGluZGljYXRvcl9zaG9ydCkpICU+JQ0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3JfbnVtYmVyKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGluZGljYXRvciA9IGluZGljYXRvcl9udW1iZXIsIHJlYWNoZWQsIGFkbTFfcGNvZGUpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgaW5kaWNhdG9yLCBjb3VudHkgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJyZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygicmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KYGBgDQoNCjxicj48YnI+PGJyPg0K